{ "cells": [ { "cell_type": "markdown", "id": "53cc3e7e", "metadata": {}, "source": [ "# Gauss Elimination\n", "**강좌**: *수치해석*" ] }, { "cell_type": "markdown", "id": "71f9848a", "metadata": {}, "source": [ "## Numpy array\n", "Python 에서 Array, Matrix는 Numpy 패키지로 사용할 수 있다.\n", "\n", "몇가지 특징을 살펴보면 다음과 같다.\n", "\n", "- 생성" ] }, { "cell_type": "code", "execution_count": 2, "id": "7401a85c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 2 3]\n", " [4 5 6]]\n", "2 (2, 3)\n" ] } ], "source": [ "import numpy as np\n", "\n", "A = np.array([[1, 2, 3], [4, 5, 6]])\n", "\n", "# Array 출력\n", "print(A)\n", "\n", "# Array 차원, 크기\n", "print(A.ndim, A.shape)" ] }, { "cell_type": "markdown", "id": "83b73ae8", "metadata": {}, "source": [ "- Indexing\n", " * Zero-based Numbering: Index는 0 부터 시작" ] }, { "cell_type": "code", "execution_count": 3, "id": "f45cab79", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "4\n" ] } ], "source": [ "# 2행, 1열의 값 a_{21}\n", "print(A[1, 0])" ] }, { "cell_type": "code", "execution_count": 4, "id": "6c2876c7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[4 5 6]\n" ] } ], "source": [ "# 2번째 행\n", "print(A[1])" ] }, { "cell_type": "code", "execution_count": 5, "id": "e9eda228", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[3 6]\n" ] } ], "source": [ "# 3번째 열\n", "print(A[:, 2])" ] }, { "cell_type": "markdown", "id": "759e75ad", "metadata": {}, "source": [ "- 연산\n", " * 합, 차\n", " * Scalar 곱" ] }, { "cell_type": "code", "execution_count": 6, "id": "4ac47478", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[1 1 1]\n", " [2 2 2]]\n" ] } ], "source": [ "B = np.array([[1, 1, 1], [2, 2, 2]])\n", "\n", "# Array B 출력\n", "print(B)" ] }, { "cell_type": "code", "execution_count": 7, "id": "09811a71", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[2, 3, 4],\n", " [6, 7, 8]])" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 합\n", "A + B" ] }, { "cell_type": "code", "execution_count": 8, "id": "26dbb5f4", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[0, 1, 2],\n", " [2, 3, 4]])" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# 차\n", "A - B" ] }, { "cell_type": "code", "execution_count": 9, "id": "f6f0c7c9", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 5, 10, 15],\n", " [20, 25, 30]])" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Scalar 곱\n", "c = 5\n", "c*A" ] }, { "cell_type": "markdown", "id": "15403412", "metadata": {}, "source": [ "- 내적 (Inner product)\n", " * `np.dot` 또는 `@` 연산\n", " \n", "$$\n", "A \\cdot \\mathbf{x} = \n", "\\begin{bmatrix}\n", "a_{1,1} & a_{1,2} & a_{1, 3} \\\\\n", "a_{2,1} & a_{2,2} & a_{2, 3}\n", "\\end{bmatrix}\n", "\\begin{bmatrix}\n", "x_1 \\\\ x_2 \\\\ x_3\n", "\\end{bmatrix}\n", "=\n", "\\begin{bmatrix}\n", "a_{1,1} x_1 + a_{1,2} x_2 + a_{1,3} x_3 \\\\\n", "a_{2,1} x_1 + a_{2,2} x_2 + a_{2,3} x_3\n", "\\end{bmatrix}\n", "$$" ] }, { "cell_type": "code", "execution_count": 10, "id": "c02a0957", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([13, 31])" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x = np.array([2,1,3])\n", "\n", "# Inner product\n", "A @ x" ] }, { "cell_type": "code", "execution_count": 11, "id": "dc69c90c", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[ 2, 2, 9],\n", " [ 8, 5, 18]])" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Elementwise production\n", "A*x" ] }, { "cell_type": "markdown", "id": "472b7c2a", "metadata": {}, "source": [ "- Transpose" ] }, { "cell_type": "code", "execution_count": 12, "id": "500e7498", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[1, 4],\n", " [2, 5],\n", " [3, 6]])" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A.T" ] }, { "cell_type": "markdown", "id": "5fa01f17", "metadata": {}, "source": [ "## Gauss 소거법\n", "- 연립방정식 소거법을 적용\n", " * Forward elimination: Upper triangular matrix 구성\n", " \n", " $$\n", " a_{j,k} - \\frac{a_{j, i}}{a_{i,i}} \\times a_{i,k} ~~~ \\textrm{for}~~j > i~~\\textrm{and}~~k\\geq i\n", " $$\n", " * Backward substitution\n", " \n", " $$\n", " x_i = \\frac{1}{a_{i,i}} \\left (\\tilde{b}_i - \\sum_{j=i+1}^n a_{i,j} x_j \\right )\n", " $$\n", " \n", "### By hand \n", "- 예제\n", "\n", "$$\n", "\\begin{bmatrix}\n", "2 & 1 & 1 \\\\\n", "4 & -6 & 0 \\\\\n", "-2 & 7 & 2\n", "\\end{bmatrix}\n", "\\mathbf{x}\n", "=\\begin{bmatrix}\n", "5 \\\\ -2 \\\\ 9\n", "\\end{bmatrix}\n", "$$" ] }, { "cell_type": "code", "execution_count": 13, "id": "1600f29c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 2 1 1]\n", " [ 4 -6 0]\n", " [-2 7 2]] [ 5 -2 9]\n" ] } ], "source": [ "# Make matrix, array\n", "A = np.array([[2, 1, 1], [4, -6, 0], [-2, 7, 2]])\n", "b = np.array([5, -2, 9])\n", "\n", "print(A, b.T)" ] }, { "cell_type": "code", "execution_count": 14, "id": "20acded5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 -8 -2] -12\n" ] } ], "source": [ "# first pivot a_{1,1}\n", "# eliminate a_{2,1}\n", "i = 0\n", "j = 1\n", "ratio = A[j, i] / A[i, i]\n", "\n", "A[j] = A[j] - ratio*A[i]\n", "b[j] = b[j] - ratio*b[i]\n", "\n", "print(A[j], b[j])" ] }, { "cell_type": "code", "execution_count": 15, "id": "0bf2ef0e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 8 3] 14\n" ] } ], "source": [ "# eliminate a_{3,1}\n", "j = 2\n", "ratio = A[j, i] / A[i, i]\n", "\n", "A[j] = A[j] - ratio*A[i]\n", "b[j] = b[j] - ratio*b[i]\n", "\n", "print(A[j], b[j])" ] }, { "cell_type": "code", "execution_count": 16, "id": "6837cac5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0 0 1] 2\n" ] } ], "source": [ "# next pivot a_{2,2}\n", "# eliminate a_{3, 2}\n", "i = 1\n", "j = 2\n", "\n", "ratio = A[j, i] / A[i, i]\n", "\n", "A[j, i:] = A[j, i:] - ratio*A[i, i:]\n", "b[j] = b[j] - ratio*b[i]\n", "\n", "print(A[j], b[j])" ] }, { "cell_type": "code", "execution_count": 17, "id": "d1389e74", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[[ 2 1 1]\n", " [ 0 -8 -2]\n", " [ 0 0 1]] [[ 5]\n", " [-12]\n", " [ 2]]\n" ] } ], "source": [ "print(A, b[:, None])" ] }, { "cell_type": "markdown", "id": "33748796", "metadata": {}, "source": [ " * Forward elimination 결과\n", " \n", "$$\n", "\\begin{bmatrix}\n", "2 & 1 & 1 \\\\\n", "0 & -8 & -2 \\\\\n", "0 & 0 & 1\n", "\\end{bmatrix}\n", "\\mathbf{x}\n", "=\\begin{bmatrix}\n", "5 \\\\ -12 \\\\ 2\n", "\\end{bmatrix}\n", "$$ " ] }, { "cell_type": "code", "execution_count": 18, "id": "c6f8a141", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2\n" ] } ], "source": [ "x = np.empty_like(b)\n", "\n", "# Third row\n", "i = 2\n", "xi = b[i] / A[i,i]\n", "x[i] = xi\n", "print(x[i])" ] }, { "cell_type": "code", "execution_count": 19, "id": "1f0fafb8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "# Second row\n", "i = 1\n", "xi = (b[i] - A[i, i+1]*x[i+1]) / A[i, i]\n", "x[i] = xi\n", "print(x[i])" ] }, { "cell_type": "code", "execution_count": 20, "id": "3ff1b9b9", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1\n" ] } ], "source": [ "# First row\n", "n = 3\n", "i = 0\n", "xi = b[i]\n", "\n", "for j in range(i+1, n):\n", " xi -= A[i, j]*x[j]\n", " \n", "xi /= A[i,i]\n", "\n", "x[i] = xi\n", "print(x[i])" ] }, { "cell_type": "code", "execution_count": 21, "id": "0b48396e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1 1 2]\n", "[ 5 -2 9]\n" ] } ], "source": [ "# Solution\n", "print(x)\n", "\n", "# 검산\n", "A = np.array([[2, 1, 1], [4, -6, 0], [-2, 7, 2]])\n", "print(A @ x)" ] }, { "cell_type": "markdown", "id": "74a81a76", "metadata": {}, "source": [ "### Python code" ] }, { "cell_type": "code", "execution_count": 22, "id": "99718533", "metadata": {}, "outputs": [], "source": [ "def gauss_eliminate(A, b):\n", " \"\"\"\n", " Gauss Elimination\n", " \n", " Parameters\n", " ----------\n", " a : matrix\n", " Linear operator\n", " b : array\n", " Result\n", " \n", " Returns\n", " --------\n", " x : array\n", " Solution\n", " \"\"\" \n", " \n", " # Check size\n", " m, n = np.array(A).shape\n", " l = len(b)\n", " \n", " if (m != n) or (n != l) or (m != l):\n", " raise ValueError('Wrong shape', m,n,l)\n", " \n", " # Forward elimiation\n", " for i in range(n):\n", " if A[i, i] == 0.0:\n", " raise ValueError('Pivot is zero')\n", " \n", " for j in range(i+1, n):\n", " ratio = A[j, i] / A[i, i]\n", "\n", " #A[j, i:] = A[j, i:] - ratio*A[i, i:]\n", " for k in range(i+1, n):\n", " A[j, k] = A[j, k] - ratio*A[i, k]\n", " b[j] = b[j] - ratio*b[i]\n", " \n", " # Back substitution\n", " x = np.empty(n)\n", " \n", " for i in range(n-1, -1, -1):\n", " x[i] = b[i]\n", "\n", " for j in range(i+1, n):\n", " x[i] -= A[i, j]*x[j]\n", "\n", " x[i] /= A[i,i]\n", " \n", " return x" ] }, { "cell_type": "code", "execution_count": 23, "id": "9b6cb77d", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[1. 1. 2.]\n" ] } ], "source": [ "A = np.array([[2, 1, 1], [4, -6, 0], [-2, 7, 2]])\n", "b = np.array([5, -2, 9])\n", "\n", "x = gauss_eliminate(A, b)\n", "print(x)" ] }, { "cell_type": "markdown", "id": "2133bbfd", "metadata": {}, "source": [ "### Computational Costs\n", "\n", "- Gauss Elimination 코드 계산 시간 확인" ] }, { "cell_type": "code", "execution_count": 24, "id": "262b8897", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Size of matrix : 2\n", "2.93 μs ± 198 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n", "Size of matrix : 3\n", "5.82 μs ± 163 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n", "Size of matrix : 4\n", "11.5 μs ± 238 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n", "Size of matrix : 5\n", "19.2 μs ± 613 ns per loop (mean ± std. dev. of 7 runs, 100,000 loops each)\n", "Size of matrix : 6\n", "31.8 μs ± 1.82 μs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n", "Size of matrix : 7\n", "46.5 μs ± 4.63 μs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n", "Size of matrix : 8\n", "63.9 μs ± 2.84 μs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n", "Size of matrix : 9\n", "90.4 μs ± 3.98 μs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n", "Size of matrix : 10\n", "119 μs ± 1.8 μs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n", "Size of matrix : 11\n", "158 μs ± 3.06 μs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)\n", "Size of matrix : 12\n", "206 μs ± 8.85 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n", "Size of matrix : 13\n", "247 μs ± 15.6 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n", "Size of matrix : 14\n", "299 μs ± 12.7 μs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)\n" ] } ], "source": [ "size = np.arange(2, 15)\n", "elapsed = []\n", "\n", "for n in size:\n", " a = np.random.rand(n, n)\n", " b = np.random.rand(n)\n", " \n", " print(\"Size of matrix : \", n)\n", " t = %timeit -o gauss_eliminate(a, b)\n", " elapsed.append(t.average)" ] }, { "cell_type": "code", "execution_count": 25, "id": "8beaf31d", "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "from matplotlib import pyplot as plt\n", "\n", "import numpy as np\n", "\n", "plt.style.use('ggplot')\n", "plt.rcParams['figure.dpi'] = 150" ] }, { "cell_type": "code", "execution_count": 28, "id": "1f26e042", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0, 0.5, 'Elapsed time')" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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8p///If333+f3r1707ZtW0qXLs2mTZs4ceIE1atXZ+zYsfbrf/75Z+bOnUvdunXzvJbbb7+de++9l5kzZ/Lmm2/at5W4VsqWLct9993H999/T7du3Wjfvj2+vr5s3LiR7Oxs+vfvz+zZs/PV69atm3110nbt2uHv70/p0qXtr+3tt9/m6NGjzJ8/n99++40GDRoQEhJCbGwshw8fJjo6mkcffZRbbrnlouL08/OjcePG9pUoz08IbVNRHZ0rTKdOnfD19eXrr79m3759hISEYBgGTz75pMPpxVdq2rRpjBs3jvr161OtWjVM0+T48ePs2LEDq9VKmzZteOWVVy6pzapVq/Lqq6/y5ptv0q9fP/t7cePGjRiGQdeuXS9pr8VevXrxwAMP8P3339OlSxfat2+Pn58f69evJz4+nmbNmhX4O1aQvn37snTpUpYuXUrHjh3p0KEDpmny559/0qZNGwzDyDddtkaNGnz66ac888wzPPzww9SsWZPatWtjmiaRkZHs37+fjIwM+vTp43C67OXq2rUre/bsoV27drRu3ZrExETWrl1LZmYmw4cPz7Nlj7+/P59++imDBw/mpZde4vvvv6dGjRocOHCAv//+G39/fz777LNLfobywQcftP8uFbSwzeUwDINPP/2Ufv368emnn7Js2TIaNGjA8ePH2bRpE56enowfP94l01D79+/Pf//7X/s+l40bN+bMmTNs2LCB2267je3btxc4RVhECrds/xkOnjq3qNzj/8zDq3otjM63uy6oIkojiyIuZpvmdKFl5OHcyOPcuXPzjY688847vPzyy0RGRvLLL79gGAaDBw9m7ty5BW6ZcMcdd/C///0Pi8XC8uXLiYqK4rbbbmPhwoWFJq4FefbZZ5k2bRpt2rThr7/+YunSpXh7e/P000+zaNEi+zNnx48f55VXXsHb25tPPvkk3yqT7777LlWrVuW7775zOIJytY0bN4433niDKlWq2Kd53nTTTSxdurTAVRMfffRRhg8fTkBAAEuWLGHGjBl5phP6+fkxY8YMPvroIxo2bMi+fftYtmwZR44coVq1aowaNcrhs6iFsSWBuZ9XPP+cYRiXNIUuNDSUKVOm0KxZMzZu3MjMmTOZMWPGVXs+6qWXXuLOO+8kJSWF1atX88svv3D8+HE6duzIxIkTmTNnTp59KS/WY489xpdffkmDBg3YtGkTa9asoW3btixcuJBSpUpdcnsffPABH3/8MTfeeCMbNmzgt99+o2zZsrz00kvMnj37kpMzwzD44osveOmllyhTpgwrV65k165dPPLII0yePLnAKVA9evTg119/5cEHHyQrK4tVq1axfv16e5I4bdo0p26RAjnPbS5YsIAOHTrYn5GtXbs2EyZM4MUXX8x3/U033cSSJUu46667iIqKYvHixcTGxtoT5MuZ0mmbgluhQgU6d+58pS8pjxtuuIHly5fzwAMPkJyczOLFizl48CDdu3dn/vz5ebb6uZZKly7N4sWL6dOnDxkZGfz6669ER0fzwgsv8Pnnn7skJpHi4FRqFt/9FWs/7hS9hYaJR7EMegbDcmXboBVHhqlJ7+JkUVFRhT5LYZom8fHxlClT5qrMCXfFAjeu1Lp1ayIjIy9p0Y4RI0YwZ84c5syZ43A/Mle73vqwuFH/uT9PT0/Wrl1L37596devX4FTY6+VTz75hPfff5+RI0fy/PPPuzQWd3Exv4dX+99juXy2L1djY2MvcKVcqo/WHOfPo4kABGSm8OnGjyh1W08sdz7g1PsUhT40DKPAra4ulkYWRUREpMhKTExk6tSpeHt788ADzv0wJyLXl21RyfZEEeDBQ0spWSYYo0c/F0ZVtOmZRRERESlyZs2axfr16wkPDycmJobHHnvskrbzERHJLT3Lypcbo+3Hdc4epVvURiz/eRfD6+IXKLveaGRRREREipz169czZ84ckpOTeeSRRy55oSMRkdx+2h1PdFLOysIWM5sn/pmLR8dbMeo0cHFkRZueWRSn0zOLcqXUh+5N/ef+1IfuT88surei8LxbcRKZkM7wxUfI+nevjDsi/uDhuHVY3vo/DP/Aq3LPotCHemZRRERERESkAKZp8t+NMfZEsXT6Ge498iuW+x+/aolicaJkUUREREREiqU/jiSwIybFfjxk/wL8GjbFaFb0VoMvipQsioiIiIhIsZOUns03W8/tE9w8fg+tkw9huf8JF0blXpQsioiIiIhIsfPdX7GcTcsGwDs7gyH752PpOwijVBkXR+Y+lCzKNWcYBoZhkJ2d7epQRERErlvZ2dn2f5NFipt9caks23/Gftz/6G+EVArF6NjddUG5ISWL4hK+vr6kpqYWumqqiIiIXD3p6el4e2t/OSl+sq0mX2yMxvYps3JyNHdE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ctFFtb85LFmyhA8++ACr1crAgQPx8fFhx44dlJeXM2PGDCZPnux2vs1m46677qo1TkNhsSn31FSZmZl48v9W0dHRAOTm5nqsBjk3mkPvpvnzfprDs1NudzBnXQbr00+62jpXFPDM5r8QVVZY1dChS9XWGFGxzVKT5tC7af68X0uYQ8Mw6NChwzmN0WpeQ120aBGpqan06tWLp556ioCAqlXFEhMTmT9/Pm+//TazZ89u1FgffvghmZmZjBw5kkceeQSrteqD5++//z7Lli3jww8/5MEHH3Trs3LlSpKSkujQoQOzZ88mIiICgKSkJObMmcObb77J3LlzXWMBZGRksGDBAleY7NWrl6v96aefZsGCBQwZMsRtkq1WK2PGjKFHjx706NGDQ4cOMW/evAtyTyIiInJmtnI7L31/lB9zTrnaepdk8Put7xBa+VNbn4ux/PpJjKAQD1UpItI0Fk8XcD5UVlaybNkyAO6++25XUASYMmUK8fHxpKSkcODAgQbHKigoYM2aNVitVu655x63cHf77bcTFhbG2rVrKSgocOuXmJgIwK233uoKigCjRo1i+PDhZGdns2nTJrc+S5YswW63M2nSJFdQBOjYsSM33HADdrudpUuXuvUJCAjgwQcf5Oqrr6ZXr174+fldsHsSERGR+h0/Vcms5UfcguKwgr08t/kvrqBojJ6A5eFnFRRFxCu1irC4Z88ebDYbsbGxdOvWrdbxSy65BIDNmzc3OFZycjKmadKvXz+30Afg6+vLsGHDcDgcbNu2zdWek5PD0aNH8fPzY+jQobXGHDWq6kPsW7ZscWvfunWr2/GaRo8eXWefpmjKPYmIiEj9MovLefKbwxw8UeZqG5+9lSe2v4e/owIAY+otGHc9jOHj66kyRUTOSasIi4cPHwaoMygCdO/e3e28cxnL2e5cjKbm1126dMHHp/abvc4+Na9vs9nIy8sDqha0OV1kZCShoaHk5uZSUlLSYN1n0pR7EhERkbrtP17KE/85TPbJClfb9emreDDln/iYDrD6YPzqESzX/hLDMDxXqIjIOWoVYdEZuupb8bR9+/Zu5zVmLGef0zmvUXOshq5/pj7BwcFur8021K8pmnJPIiIiUtv2LBu///YIhWV2V9ud+xK5Y/8SDICgYCyPzMYyerzHahQROV9axQI3paWlAPj7+9d53BnGnOedy1jO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rc6TTz7Jk08+6eky5BxoDr2b5s/7aQ69n+bQu2n+vF9rmUN9ZlFanfLyck+XIOdIc+jdNH/eT3Po/TSH3k3z5/1ayxzqyaKIiIiIiIjUorAoIiIiIiIitSgsioiIiIiISC0KiyIiIiIiIlKL9lkUERERERGRWvRkUURERERERGpRWBQREREREZFaFBZFRERERESkFoVFERERERERqUVhUURERERERGpRWBQREREREZFaFBZFRERERESkFh9PFyByrsrKyti+fTtbtmxh//795Obm4nA4iIuL45JLLmHKlCkEBAR4ukw5CydPnmTmzJkUFRXRsWNH5s6d6+mSpJEKCgr48ssvSU5OJi8vDz8/P2JiYhg4cCC33Xabp8uTBqSlpbF48WJSU1M5efIkAQEBdOvWjSuvvJJRo0Z5ujwBDhw4wI4dO9i3bx979+7lxIkT+Pr68vHHH5+x3/fff8+yZcs4evQoPj4+9OrVixtvvJHevXs3U+XidDZz6HA4SE1NZcuWLezevZucnBxKSkqIjIxk4MCBXH/99cTExHjgLtqupv4drOn5559n586dAPztb38jIiLiAlV77hQWxeutXbuWd955B4AuXbowaNAgTp06RVpaGgsXLmTdunU899xzhIeHe7hSaawPP/yQ4uJiT5chZyktLY2XX34Zm81G586dGT58OKWlpRw9epTExESFxRZu/fr1zJ07F9M06dGjB/379+fEiRPs2rWLH3/8keuuu45bb73V02W2eZ9//jmbN28+qz4ffvghX3/9NX5+flx88cVUVFSwY8cOtm/fzqOPPsrIkSMvULVSl7OZw5ycHJ599lkA2rdvT69evbBYLOzbt4/ly5ezbt06fve739GnT58LWbLU0JS/gzWtWrWKnTt3YhgGpmmex8ouDIVF8Xo+Pj5ceeWVXHPNNXTo0MHVfuLECV555RUOHjzIBx98wMMPP+zBKqWxdu7cyffff8/EiRNZvny5p8uRRjp+/Dgvv/wyFRUVPP7447X+8blv3z4PVSaNYbfbee+99zBNk5kzZ3LppZe6jqWlpTF79mwWL17MFVdcQVxcnAcrlV69epGQkECPHj3o0aMH99577xnP//HHH/n6668JDQ3lhRdecH2fTEtL47nnnuP//u//6NevHyEhIc1RvnD2czho0CBuuOEG+vXr52qrqKjg3XffZdWq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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "fig, ax = plt.subplots()\n", "ax.plot(size, elapsed, marker='x')\n", "\n", "# Approximate elapsed time with 3rd order polynomial\n", "z = np.polyfit(size, elapsed, 3)\n", "appxf = np.poly1d(z)\n", "\n", "ax.plot(size, appxf(size))\n", "ax.legend(['Elapsed', 'Approximate with 3rd order polynomial'])\n", "ax.set_xlabel('Size')\n", "ax.set_ylabel('Elapsed time')" ] }, { "cell_type": "markdown", "id": "50f071f1", "metadata": {}, "source": [ "- Forward elimination\n", " - 첫번째 pivot (이후 n-1 rows)\n", " * each row: n번 Add/sub, n+1번 Mul\n", " - 두번째 pivot (이후 n-2 rows)\n", " * each row: (n-1)번 Add/sub, n번 Mul\n", " - ...\n", " - 마지막 pivot (마지막 row)\n", " * last row: 2번 Add/sub, 3번 Mul\n", " \n", " - Total\n", " * Add/Sub\n", " \n", " $$\n", " \\sum_{k=1}^{n-1} (n-k)(n+1-k)= \\frac{1}{3} n^3 - \\frac{1}{3} n\n", " $$\n", " \n", " * Mul\n", " \n", " $$\n", " \\sum_{k=1}^{n-1} (n-k)(n+2-k)= \\frac{1}{3} n^3 + \\frac{5}{2} n^2 - \\frac{17}{6}\n", " $$ \n", " \n", " * All : $\\frac{2}{3} n^3 + O(n^2)$\n", " \n", "- Backward substitution\n", " - $O(n^2)$" ] }, { "cell_type": "markdown", "id": "c6210c9e", "metadata": {}, "source": [ "## 문제점\n", "- Round-off Error\n", "\n", "- Pivot이 0일 때\n", " * Row exchange 필요\n", " \n", "- ill-conditioned system\n", " * 2x2 선형 방정식\n", "\n", " $$\n", " \\left [\n", " \\begin{matrix}\n", " 1 & 1 \\\\\n", " 1 & 1+\\epsilon_1\n", " \\end{matrix}\n", " \\right ]\n", " \\left [\n", " \\begin{matrix}\n", " x \\\\ y\n", " \\end{matrix}\n", " \\right ]\n", " =\n", " \\left [\n", " \\begin{matrix}\n", " 2 \\\\ 2 + \\epsilon_2\n", " \\end{matrix}\n", " \\right ]\n", " $$\n", "\n", " - $\\epsilon_2=0$ : $(x,y) = (2, 0)$\n", " - $\\epsilon_2 \\ne 0$ : $(x,y) = (1, 1)$" ] }, { "cell_type": "code", "execution_count": 26, "id": "bc8a7a04", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([2., 0.])" ] }, "execution_count": 26, "metadata": {}, "output_type": "execute_result" } ], "source": [ "e1 = 1e-3\n", "a = np.array([[1, 1], [1, 1+e1]])\n", "b = np.array([2, 2])\n", "\n", "gauss_eliminate(a, b)" ] }, { "cell_type": "code", "execution_count": 27, "id": "b5f18cde", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1., 1.])" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "e1 = 1e-3\n", "a = np.array([[1, 1], [1, 1+e1]])\n", "b = np.array([2, 2+e1])\n", "\n", "gauss_eliminate(a, b)" ] }, { "cell_type": "code", "execution_count": 28, "id": "703795c0", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Exponent of e2: -1, Sol : [1. 1.]\n", "Exponent of e2: -2, Sol : [1. 1.]\n", "Exponent of e2: -3, Sol : [1. 1.]\n", "Exponent of e2: -4, Sol : [1. 1.]\n", "Exponent of e2: -5, Sol : [1. 1.]\n", "Exponent of e2: -6, Sol : [1. 1.]\n", "Exponent of e2: -7, Sol : [1. 1.]\n", "Exponent of e2: -8, Sol : [1. 1.]\n", "Exponent of e2: -9, Sol : [1. 1.]\n", "Exponent of e2: -10, Sol : [1. 1.]\n", "Exponent of e2: -11, Sol : [1. 1.]\n", "Exponent of e2: -12, Sol : [1. 1.]\n", "Exponent of e2: -13, Sol : [1. 1.]\n", "Exponent of e2: -14, Sol : [0.97777778 1.02222222]\n", "Exponent of e2: -15, Sol : [1.2 0.8]\n" ] } ], "source": [ "for n in range(1, 16):\n", " e1 = 10**(-n)\n", " \n", " a = np.array([[1, 1], [1, 1+e1]])\n", " b = np.array([2, 2+e1])\n", " \n", " x = gauss_eliminate(a, b)\n", " print(\"Exponent of e2: -{}, Sol : {}\".format(n, x))" ] }, { "cell_type": "markdown", "id": "adfa40df", "metadata": {}, "source": [ "## Pivoting\n", "- 계산의 순서를 바꾸서 Round-off 오차에 의한 연산 오류를 최소화 함.\n", "- 종류\n", " * Partial pivoting: $i$ 번째 컬럼 (부분 행렬에서 첫번째) 에서 절대값이 가장 큰 row를 Pivot row로 설정\n", " \n", " * Complete pivoting: 부분 행렬에서 크기가 가장 큰 성분을 포함하는 row를 Pivot row로 설정\n", " * 미지수도 재배치 됨 \n", "\n", "- Scaling\n", " * 각 row 계수의 크기를 표준화해서 오차를 줄임\n", " * Scaled partial pivoting\n", " - 각 row에서 계수의 크기가 최대인 값을 factor로 지정: $s_i = \\max_{j}|a_{ij}|$\n", " - j 번째 Pivot을 정할 때 $|a_{ij}|/s_i$ 가 최대인 row를 선택해서 Pivot row로 설정\n", "\n", "### 예제\n", "다음 선형 방정식을 계산하시오.\n", "\n", "$$\n", "\\begin{bmatrix}\n", "0.0003 & 3.0 \\\\\n", "1.0 & 1.0\n", "\\end{bmatrix}\n", "\\cdot\n", "\\mathbf{x}\n", "=\\begin{bmatrix}\n", "2.0001 \\\\ 1\n", "\\end{bmatrix}\n", "$$" ] }, { "cell_type": "code", "execution_count": 29, "id": "c279fbb7", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.3334796 , 0.66666662])" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Gauss elimination\n", "A = np.array([[0.0003, 3.0], [1, 1]], dtype=np.float32)\n", "b = np.array([2.0001, 1.0], dtype=np.float32)\n", "\n", "gauss_eliminate(A, b)" ] }, { "cell_type": "code", "execution_count": 30, "id": "1bd3508b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.3333334, 0.6666666])" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Swap first and second row (Partial pivoting)\n", "A = np.array([[1, 1], [0.0003, 3.0]], dtype=np.float32)\n", "b = np.array([1.0, 2.0001], dtype=np.float32)\n", "\n", "gauss_eliminate(A, b)" ] }, { "cell_type": "code", "execution_count": 31, "id": "08b405fa", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0.33333333, 0.66666667])" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Scaled\n", "A = np.array([[3.0, 30000.0], [1, 1]], dtype=np.float32)\n", "b = np.array([20001, 1.0], dtype=np.float32)\n", "\n", "gauss_eliminate(A, b)" ] }, { "cell_type": "markdown", "id": "7143ea5e", "metadata": {}, "source": [ "### 예제\n", "다음 선형방정식을 Paritial Pivot 기법을 이용하여 계산하시오.\n", "\n", "$$\n", "\\begin{bmatrix}\n", "3 & -13 & 9 & 3 \\\\\n", "-6 & 4 & 1 & -18 \\\\\n", "6 & -2 & 2& 4 \\\\\n", "12 & -8 & 7 & 10\n", "\\end{bmatrix}\n", "\\cdot\n", "\\mathbf{x}\n", "=\\begin{bmatrix}\n", "-19 \\\\ -34 \\\\ 16 \\\\ 26\n", "\\end{bmatrix}\n", "$$\n", "\n", "#### by hand" ] }, { "cell_type": "code", "execution_count": 32, "id": "77429747", "metadata": {}, "outputs": [], "source": [ "A = np.array([\n", " [3, -13, 9, 3],\n", " [-6, 4, 1, -18],\n", " [6, -2, 2, 4],\n", " [12, -8, 6, 10]\n", "], dtype=float)\n", "\n", "b = np.array([-19, -34, 16, 26], dtype=float)\n", "n = 4" ] }, { "cell_type": "code", "execution_count": 33, "id": "3d23c1bf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 3. 6. 6. 12.]\n" ] } ], "source": [ "# 첫번째 Pivot 결정\n", "i = 0\n", "print(abs(A[:, i]))\n", "\n", "# 4번째 row를 Pivot로 결정\n", "j = np.argmax(abs(A[:, i]))\n", "\n", "# Swap rows (A and b)\n", "for k in range(i, n):\n", " tmp = A[i, k]\n", " A[i, k] = A[j, k]\n", " A[j, k] = tmp\n", " \n", "tmp = b[i]\n", "b[i] = b[j]\n", "b[j] = tmp" ] }, { "cell_type": "code", "execution_count": 34, "id": "7373e156", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([[ 12., -8., 6., 10.],\n", " [ -6., 4., 1., -18.],\n", " [ 6., -2., 2., 4.],\n", " [ 3., -13., 9., 3.]]),\n", " array([ 26., -34., 16., -19.]))" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A, b" ] }, { "cell_type": "code", "execution_count": 35, "id": "bb2c592b", "metadata": {}, "outputs": [], "source": [ "# Row operations\n", "for j in range(i+1, n):\n", " ratio = A[j, i] / A[i, i]\n", "\n", " A[j, i:] = A[j, i:] - ratio*A[i, i:]\n", " b[j] = b[j] - ratio*b[i]" ] }, { "cell_type": "code", "execution_count": 36, "id": "2715574e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([[ 12. , -8. , 6. , 10. ],\n", " [ 0. , 0. , 4. , -13. ],\n", " [ 0. , 2. , -1. , -1. ],\n", " [ 0. , -11. , 7.5, 0.5]]),\n", " array([ 26. , -21. , 3. , -25.5]))" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A, b" ] }, { "cell_type": "code", "execution_count": 37, "id": "bb7ec707", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0. 2. 11.]\n" ] } ], "source": [ "# 두번째 Pivot 결정\n", "i = 1\n", "print(abs(A[i:, i]))\n", "\n", "# 1, 2, 3 행에서 scaled 값 비교\n", "j = np.argmax(abs(A[i:, i])) + i\n", "\n", "# Swap rows (A and b)\n", "for k in range(i, n):\n", " tmp = A[i, k]\n", " A[i, k] = A[j, k]\n", " A[j, k] = tmp\n", " \n", "tmp = b[i]\n", "b[i] = b[j]\n", "b[j] = tmp" ] }, { "cell_type": "code", "execution_count": 38, "id": "85839e9a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([[ 12. , -8. , 6. , 10. ],\n", " [ 0. , -11. , 7.5, 0.5],\n", " [ 0. , 2. , -1. , -1. ],\n", " [ 0. , 0. , 4. , -13. ]]),\n", " array([ 26. , -25.5, 3. , -21. ]))" ] }, "execution_count": 38, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A, b" ] }, { "cell_type": "code", "execution_count": 39, "id": "5bb6b556", "metadata": {}, "outputs": [], "source": [ "# Row operations\n", "for j in range(i+1, n):\n", " ratio = A[j, i] / A[i, i]\n", "\n", " A[j, i:] = A[j, i:] - ratio*A[i, i:]\n", " b[j] = b[j] - ratio*b[i]" ] }, { "cell_type": "code", "execution_count": 40, "id": "98c74433", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[0.36363636 4. ]\n" ] } ], "source": [ "# 두번째 Pivot 결정\n", "i = 2\n", "print(abs(A[i:, i]))\n", "\n", "# 2, 3 행에서 scaled 값 비교\n", "j = np.argmax(abs(A[i:, i])) + i\n", "\n", "# Swap rows (A and b)\n", "for k in range(i, n):\n", " tmp = A[i, k]\n", " A[i, k] = A[j, k]\n", " A[j, k] = tmp\n", " \n", "tmp = b[i]\n", "b[i] = b[j]\n", "b[j] = tmp" ] }, { "cell_type": "code", "execution_count": 41, "id": "aab48bad", "metadata": {}, "outputs": [], "source": [ "# Row operations\n", "for j in range(i+1, n):\n", " ratio = A[j, i] / A[i, i]\n", "\n", " A[j, i:] = A[j, i:] - ratio*A[i, i:]\n", " b[j] = b[j] - ratio*b[i]" ] }, { "cell_type": "code", "execution_count": 42, "id": "0b661aa8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(array([[ 12. , -8. , 6. , 10. ],\n", " [ 0. , -11. , 7.5 , 0.5 ],\n", " [ 0. , 0. , 4. , -13. ],\n", " [ 0. , 0. , 0. , 0.27272727]]),\n", " array([ 26. , -25.5 , -21. , 0.27272727]))" ] }, "execution_count": 42, "metadata": {}, "output_type": "execute_result" } ], "source": [ "A, b" ] }, { "cell_type": "code", "execution_count": 43, "id": "7a61612d", "metadata": {}, "outputs": [], "source": [ "# Back substitution\n", "x = np.empty_like(b)\n", "\n", "for i in range(n-1, -1, -1):\n", " x[i] = b[i]\n", "\n", " for j in range(i+1, n):\n", " x[i] -= A[i, j]*x[j]\n", "\n", " x[i] /= A[i,i]" ] }, { "cell_type": "code", "execution_count": 44, "id": "dfb2eb3a", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([ 3., 1., -2., 1.])" ] }, "execution_count": 44, "metadata": {}, "output_type": "execute_result" } ], "source": [ "x" ] }, { "cell_type": "code", "execution_count": 45, "id": "db73050f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-19., -34., 16., 26.])" ] }, "execution_count": 45, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Validation\n", "A = np.array([\n", " [3, -13, 9, 3],\n", " [-6, 4, 1, -18],\n", " [6, -2, 2, 4],\n", " [12, -8, 6, 10]\n", "])\n", "\n", "A @ x" ] }, { "cell_type": "markdown", "id": "2706a01c", "metadata": {}, "source": [ "### DIY\n", "- Partial Pivot을 하는 Gauss Elimination 함수를 작성하시요." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.13.5" } }, "nbformat": 4, "nbformat_minor": 5 }